import apiConfig from '../config/api.js'

// 参数序列化函数，替代URLSearchParams（兼容微信小程序）
const serializeParams = (params) => {
  if (!params || typeof params !== 'object') return '';
  
  return Object.keys(params)
    .map(key => {
      const value = params[key];
      // 处理各种类型的值
      if (value === null || value === undefined) return '';
      if (Array.isArray(value)) {
        return value.map(v => `${encodeURIComponent(key)}=${encodeURIComponent(v)}`).join('&');
      }
      return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
    })
    .filter(Boolean) // 过滤空字符串
    .join('&');
};

// 请求封装
const request = (options = {}) => {
	return new Promise((resolve, reject) => {
		// 请求拦截 - 如果有token，总是携带（支持可选认证）
		const { needAuth = false } = options;
		const token = uni.getStorageSync('token') || '';
		
		// 如果needAuth为true但没有token，直接提示登录
		if (needAuth && !token) {
			uni.showToast({
				title: '请先登录',
				icon: 'none'
			})
			setTimeout(() => {
				uni.navigateTo({
					url: '/pages/login/login'
				})
			}, 1500)
			reject({ message: '未登录' })
			return
		}
		
		// 合并请求参数
		const { url, method = 'GET', data = {}, params = {}, header = {} } = options
		
		// 构建完整URL
		const fullUrl = `${apiConfig.baseUrl}${url}`
		
		// 请求头配置 - 如果有token就携带
		const requestHeader = {
			'content-type': 'application/json',
			...header
		}
		
		// 只有当token存在时才添加Authorization头
		if (token) {
			requestHeader['Authorization'] = `Bearer ${token}`
		}
		
		// 处理GET请求的参数
		let requestData = data
		let requestUrl = fullUrl
		
		// 如果是GET请求，将params或data中的参数转换为URL查询参数
		if (method === 'GET') {
			// 优先使用params，如果没有则使用data
			const queryData = Object.keys(params).length > 0 ? params : data
			
			if (queryData && Object.keys(queryData).length > 0) {
				// 检查URL中是否已经包含查询参数
				const separator = fullUrl.includes('?') ? '&' : '?'
				const queryParams = serializeParams(queryData)
				requestUrl = `${fullUrl}${separator}${queryParams}`
			}
			requestData = undefined
		}
		
		// 发起请求
		uni.request({
			url: requestUrl,
			method: method,
			data: method === 'GET' ? undefined : requestData,
			header: requestHeader,
		success: (res) => {
			// 响应拦截
			if (res.statusCode === 200) {
				// 根据后端实际返回格式处理
				// 登录接口返回格式: { message: '登录成功', token, user }
				// 其他接口返回格式: { message: '操作成功', data } 或 { status: 'success', data }
				// 或者: { code: 200, message: '...', data: {...} }
				if (
					(res.data.code && res.data.code === 200) ||
					(res.data.message && (res.data.message.includes('成功') || res.data.message.includes('success'))) ||
					(res.data.status && res.data.status === 'success')
				) {
					// code为200，或登录成功、其他操作成功或status为success
					resolve(res.data)
				} else {
					// 业务逻辑错误，直接reject，由调用方处理显示
					reject(res.data)
				}
			} else if (res.statusCode === 401) {
					// 未授权，跳转到登录页
					uni.showToast({
						title: '请先登录',
						icon: 'none'
					})
					setTimeout(() => {
						uni.navigateTo({
							url: '/pages/login/login'
						})
					}, 1500)
					reject(res)
				} else {
					// HTTP错误
					uni.showToast({
						title: `请求错误: ${res.statusCode}`,
						icon: 'none'
					})
					reject(res)
				}
			},
			fail: (err) => {
				// 请求失败
				uni.showToast({
					title: '网络请求失败',
					icon: 'none'
				})
				reject(err)
			}
		})
	})
}

// 导出请求方法
export default request